package com.aidex.web.controller.common;

import com.aidex.common.config.AiDexConfig;
import com.aidex.common.constant.Constants;
import com.aidex.common.core.domain.AjaxResult;
import com.aidex.common.core.domain.entity.Company;
import com.aidex.common.utils.StringUtils;
import com.aidex.common.utils.file.FileUploadUtils;
import com.aidex.common.utils.file.FileUtils;
import com.aidex.framework.config.ServerConfig;
import com.aidex.system.service.CompanyService;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 通用请求处理
 *
 * @author ruoyi
 */
@RestController
public class CommonController {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);

    @Autowired
    private ServerConfig serverConfig;

    @Autowired
    private CompanyService companyService;

    /**
     * 通用下载请求
     *
     * @param fileName 文件名称
     * @param delete   是否删除
     */
    @GetMapping("common/download")
    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response,
            HttpServletRequest request) {
        try {
            if (!FileUtils.checkAllowDownload(fileName)) {
                throw new Exception(StringUtils.format("文件名称({})非法，不允许下载。 ", fileName));
            }
            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf('_') + 1);
            String filePath = AiDexConfig.getDownloadPath() + fileName;

            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, realFileName);
            FileUtils.writeBytes(filePath, response.getOutputStream());
            if (delete) {
                FileUtils.deleteFile(filePath);
            }
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }

    /**
     * 通用下载请求
     *
     * @param delete 是否删除
     */
    @GetMapping("common/downloadByPath")
    public void fileDownloadByPath(String filePath, Boolean delete, HttpServletResponse response,
            HttpServletRequest request) {
        try {
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, fileName);
            FileUtils.writeBytes(filePath, response.getOutputStream());
            if (delete) {
                FileUtils.deleteFile(filePath);
            }
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }

    /**
     * 通用上传请求
     */
    @PostMapping("/common/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception {

        try {
            Map<String, Object> ajax = new HashMap<>();
            OSS ossClient = null;
            Company company = companyService.get("admin123");
//            company.setEndpoint("oss-cn-hangzhou.aliyuncs.com");
//            company.setAliyunAccesssecret("ECxw6SS5YM2FgurCfJ6Q6kVCwwhZPG");
//            company.setAliyunKey("LTAI5tA32CVAUiMkHD5rtg1C");
//            company.setBucketName("wzlt-occ-manage");
//            company.setOssIsopen("20");

            if ("20".equals(company.getOssIsopen())) {

                String filePath = AiDexConfig.getUploadPath();
                // 上传并返回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = company.getEndpoint() + fileName;
                ajax.put("fileName", file.getOriginalFilename());
                ajax.put("url", url);
                // 上传文件路径
//                ossClient = new OSSClientBuilder().build(company.getEndpoint(), company.getAliyunKey(), company
//                .getAliyunAccesssecret());
//                // 2: 获取文件上传的流
//                InputStream inputStream = file.getInputStream();
//                // 3：构建日期目录
//                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
//                String datePath = dateFormat.format(new Date());// 日期目录格式：2021/10/27
//
//                // 4: 获取文件名
//                String originname = file.getOriginalFilename();
//                String date = new SimpleDateFormat("yyyyMMddHHmmssms").format(new Date());
//                String filename = originname.substring(0, originname.lastIndexOf("."));
//                String suffix = originname.substring(originname.lastIndexOf("."));
//                String newName = filename + date + suffix;
//                String fileUrl = datePath + "/" + newName;
//                //5：文件上传到阿里云服务器
//                ossClient.putObject(company.getBucketName(), fileUrl, inputStream);
//                // String url = "https://" + company.getBucketName() + "." + company.getEndpoint() + "/" + fileUrl;
//                String url = "https://projectfund.yichangct.com/ossimg/" + fileUrl;
//                ajax.put("fileName", originname);
//                ajax.put("url", url);
                return AjaxResult.success(ajax);
            } else {
                // 上传文件路径
                String filePath = AiDexConfig.getUploadPath();
                // 上传并返回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = company.getEndpoint() + fileName;
//                String url = serverConfig.getUrl() + fileName;
                ajax.put("fileName", file.getOriginalFilename());
                ajax.put("url", url);
//                String filePath = AiDexConfig.getUploadPath();
//                // 上传并返回新文件名称
//                String fileName = FileUploadUtils.upload(filePath, file);
//                String url = serverConfig.getUrl() + fileName;
//                ajax.put("fileName", file.getOriginalFilename());
//                ajax.put("url", url);

                return AjaxResult.success(ajax);
            }


        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 通用上传请求
     */
    @PostMapping("/common/apiupload")
    public AjaxResult apiuploadFile(MultipartFile file, String companyId) throws Exception {

        try {
            Map<String, Object> ajax = new HashMap<>();
            OSS ossClient = null;
            Company company = companyService.get(companyId);
            if (company == null) {
                company = new Company();
                company.setEndpoint("oss-cn-hangzhou.aliyuncs.com");
                company.setAliyunAccesssecret("ECxw6SS5YM2FgurCfJ6Q6kVCwwhZPG");
                company.setAliyunKey("LTAI5tA32CVAUiMkHD5rtg1C");
                company.setBucketName("wzlt-occ-manage");
                company.setOssIsopen("20");
            }
            if ("20".equals(company.getOssIsopen())) {
                // 上传文件路径
                ossClient = new OSSClientBuilder().build(company.getEndpoint(), company.getAliyunKey(),
                        company.getAliyunAccesssecret());
                // 2: 获取文件上传的流
                InputStream inputStream = file.getInputStream();
                // 3：构建日期目录
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
                String datePath = dateFormat.format(new Date());// 日期目录格式：2021/10/27

                // 4: 获取文件名
                String originname = file.getOriginalFilename();
                String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
                String filename = originname.substring(0, originname.lastIndexOf("."));
                String suffix = originname.substring(originname.lastIndexOf("."));
                String newName = filename + date + suffix;
                String fileUrl = datePath + "/" + newName;
                //5：文件上传到阿里云服务器
                ossClient.putObject(company.getBucketName(), fileUrl, inputStream);
                String url = "https://" + company.getBucketName() + "." + company.getEndpoint() + "/" + fileUrl;
                ajax.put("fileName", originname);
                ajax.put("url", url);
                return AjaxResult.success(ajax);
            } else {
                // 上传文件路径
                String filePath = AiDexConfig.getUploadPath();
                // 上传并返回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = serverConfig.getUrl() + fileName;
                ajax.put("fileName", fileName);
                ajax.put("url", url);
                return AjaxResult.success(ajax);
            }

        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 本地资源通用下载
     */
    @GetMapping("/common/download/resource")
    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            if (!FileUtils.checkAllowDownload(resource)) {
                throw new Exception(StringUtils.format("资源文件({})非法，不允许下载。 ", resource));
            }
            // 本地资源路径
            String localPath = AiDexConfig.getProfile();
            // 数据库资源地址
            String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
            // 下载名称
            String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, downloadName);
            FileUtils.writeBytes(downloadPath, response.getOutputStream());
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }
}
